<?php

/**
 * Store_GoodsController
 *
 * Модуль магазина, контроллер товаров
 * Тут собраны все методы для работы с njdfhfvb
 *
 * @package   Store
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com>
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */

class Store_GoodsController extends Lord_Controller_Action
{

/*------------------------------------------------------------------------------*/

	/**
	 * Индексный метод.
	 * Будет отображать список товаров
	 * Этот метод используется для отображения
	 * товаров из категории и из производителя
	 */

	public function indexAction()
	{
		// получаем айдишник категории
		//$cid = $this->_checkCid();
		$cid = $this->_checkCategory()->id;
		//$mid = $this->_checkMid();
                   
		// проверяем обычную сортировку
		$sort             = $this->_checkSort();
		// и сортировку по производителю
		$sortManufacturer = $this->_checkSortManufacturer();

		// достаем все категории и парсим для определения дочерних категорий
		$items = $this->model->getAllCategories()->toArray();
		$children = $this->_getChildren($items, $cid);

		// проверим, есть ли у нас кука от фильтра
		$cookie = (isset($_COOKIE['Profit_Filter']))
				 ? $_COOKIE['Profit_Filter']
				 : array();   
		if($cookie)
		{     
			// если кука есть - достанем данные фильтра, найдем товары по ним
			$filter = $this->model->getFilter($cookie);
			$filterData = ($filter)
						? unserialize(base64_decode($filter->params))
						: array(); 
            // если мы находимся в той категории, к которой мы применяли фильтр
            if($filterData['cid'] == $cid)
            {
                // свойства товаров приведем к нужному виду, чтоб проще было в модели перебирать
                $properties = array();  
                foreach($filterData as $k=>$v)
                {         
                    $propertyId = intval(str_replace('property', '', $k));
                    if($propertyId)
                    {
                        // получили нужные значения свойства
                        if(is_array($v))$properties[$propertyId] = $v;
                        // удалим за собой ненужные остатки
                        unset($filterData['property'.$propertyId]);
                    }
                }       
                $filterData['properties'] = $properties;
                $goods = $this->model->getFilteredGoods($children,
                                                        $filterData,
                                                        $sort,
                                                        $this->_helper->config()->filter_logic);
                
            }
            // если кука есть, но категория не та, которую фильтровали
            else
            {        
                //достаем товары с простой сортировкой
                $goods = $this->model->getGoods($children,
                                                $cid,
                                                $sortManufacturer,
                                                $sort);
            }

		}
		else
		{
			// если куки нет - достаем товары с простой сортировкой
			$goods = $this->model->getGoods($children,
											$cid,
											$sortManufacturer,
											$sort);
		}

		// для получения списка производителей товаров из категории,
		// мы достанем продукты, но без сортировщика.
		$manufacturersList = array();
		$sGoods = $this->model->getGoods($children, $cid);
		foreach($sGoods as $good)
		{
			$manufacturersList[$good->mid] = '';
			$images[$good->id]['goodUrl'] = $good->url;
		}
		$manufacturersData = $this->model->getManufacturers($manufacturersList);
		$manufacturers = array();
		foreach($manufacturersData as $key=>$val)
		{
			$manufacturers[$val['id']] = $val['name'];
		}

		// отсортируем производителей в алфавитном порядке
		asort($manufacturers);

		// товары уже есть, получаем картинки для них
		// еще можно сделать массив тэгов из ключевых слов
		//$images        = array();
		$tags          = array();
		$imagesList    = array();
		foreach($goods as $v)
		{
			$imagesList[]['id'] = $v['id'];
		}

		$imagesData = $this->model->getImages($imagesList);
		foreach($imagesData as $iK => $iV)
		{
			if($iV['main'] == 1)
			{
				$images[$iV['gid']]['file']    = $iV['file'];
			}
		}

		// передаем в шаблон вида
		$this->view->category         = $this->model->getCategory($cid);
		$this->view->sort             = $sort;
		$this->view->sortManufacturer = $sortManufacturer;
		$this->view->manufacturers    = $manufacturers;
		// товары вывожу с помощью хэлпера
		$this->view->goods          = $this->_helper->paginator($goods);
		$this->view->images         = $images;

		return;
	}

/*------------------------------------------------------------------------------*/

	/**
	 * Персональная страничка товара
	 */

	public function viewAction()
	{
		$good = $this->_checkGood();
		// получаем данные для заполнения формы
		//$id = $this->_checkId();
		$id = $good->id;

		// получаем дянные для отображения товара
		//$good         = $this->model->getGood($id);
		$images       = $this->model->getGoodImages($id)->toArray();
		$manufacturer = $this->model->getManufacturer($good->mid);
		$tags = explode(',', $good->seo_keywords);
		$tags = (count($tags) < 2 )
			  ? explode(' ', $good->seo_keywords)
			  : explode(',', $good->seo_keywords);

		// связаные товары и их картинки
		$relatedImages = array();
		$related = ($good->related != null)
				 ? $this->model->getSomeGoods(explode('|', $good->related))
				 : array();
		$relatedImagesData = $this->model->getImages($related)->toArray();
        foreach($relatedImagesData as $image)
        {    
            $relatedImages[$image['gid']]['file'] = $image['file'];
        }		
        foreach($related as $rel)
		{    
			$relatedImages[$rel['id']]['goodUrl'] = $rel['url'];
		}
          

		// если в $good пусто - нам пытаются скормить что-то не то
		if(empty($good))
			return $this->view->err = 'store_goods_view_fail';

		$this->_processQuestion();

		// свойства товара
		$properties = $this->model->getGoodProperties($good->id, $good->cid, 'good')->toArray();
		// значения свойств товара
		foreach($properties as $id=>$property)
		{
			$value = $this->model->getGoodPropertyValue($good->id, $property['id']);
			$properties[$id]['value'] = $value['value'];
		}

		// отправляем данные в шаблон
		$this->view->good           = $good;
		$this->view->properties     = $properties;
		$this->view->related        = $related;
		$this->view->related_images = $relatedImages;
		$this->view->tags           = $tags;
		$this->view->images         = $images;
		$this->view->manufacturer   = $manufacturer;

		return;
	}

/*------------------------------------------------------------------------------*/

	/**
	 * Витрина магазина
	 * Она же - первая страница, на кототрую попадает
	 * юзер, кликнув на "магазин"
	 */

	public function frontAction()
	{
		// достаем товары
		$goods    = $this->model->getFront();
		$newGoods = $this->model->getNewGoods();
		$hitGoods = $this->model->getHitGoods();

		// товары уже есть, получаем картинки для них
		// еще можно сделать массив тэгов из ключевых слов
		$images     = array();
		$imagesList = array();
		foreach($goods as $v)
		{
			$imagesList[]['id'] = $v['id'];
			$images[$v->id]['goodUrl'] = $v->url;
		}
		foreach($newGoods as $v)
		{
			$imagesList[]['id'] = $v['id'];
			$images[$v->id]['goodUrl'] = $v->url;
		}
		foreach($hitGoods as $v)
		{
			$imagesList[]['id'] = $v['id'];
			$images[$v->id]['goodUrl'] = $v->url;
		}

		$imagesData = $this->model->getImages($imagesList);
		foreach($imagesData as $iK => $iV)
		{
			if($iV['main'] == 1)
			{
				$images[$iV['gid']]['file'] = $iV['file'];
			}
		}

		//$this->_helper->layout->disableLayout();

		$this->view->goods     = $goods;
		$this->view->newGoods  = $newGoods;
		$this->view->hitGoods  = $hitGoods;
		$this->view->images    = $images;
		//$this->view->tags      = $tags;

		return;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Добавление товара
	*/

	public function addAction()
	{
		$this->_process('add');
	}

/*------------------------------------------------------------------------------*/

	/**
	* Редактирование товара
	*/

	public function editAction()
	{
		// достаем нужные данные
		$data = $this->model->getGood($this->_checkId())->toArray();
                 
		// достаем особые свойства товара
		$properties = $this->model->getGoodProperties($data['id'], $data['cid'])->toArray();
		// и их значения
		foreach($properties as $property)
		{
			$value = $this->model->getGoodPropertyValue($data['id'], $property['id']);
			$data[$value['property_id']] = $value['value'];
		}

		// если в $data пусто - нам пытаются скормить что-то не то
		if(empty($data))
			return $this->view->err = 'store_goods_edit_fail';

		// и отдаем на редактирование
		$this->_process('edit', $data);
	}

/*------------------------------------------------------------------------------*/

	/**
	* Удаление товара
	*/

	function deleteAction()
	{
		// проверяем айдишник
		$id = $this->_checkId();

		// достаем нужные данные
		$good     = $this->model->getGood($id);
		$category = $this->model->getCategory($good->cid);
		$images   = $this->model->getGoodImages($good->id);

		// отдаем в шаблон
		$this->view->category = $category;
		$this->view->good     = $good;

		// если юзер подтвердил - удаляем
		if ($this->_request->isPost())
		{
			if ($this->_request->getPost('conf') == 'ok')
			{
				// удаляем запись товара из базы
				$this->model->delGood($id);

				// удаляем картинки
				foreach($images as $k=>$v)
				{
					// удаляем записи о картинке в базе
					$this->model->delImage($v['id']);

					// удаляем файлы
					unlink('content/store/goods/min/'  . $v['file']);
					unlink('content/store/goods/mid/'  . $v['file']);
					unlink('content/store/goods/max/'  . $v['file']);
				}
			}
		}
		else
		{
			// если в $this->view->good пусто - нам пытаются скормить левый $id
			if(empty($this->view->good))
				return $this->view->err = 'store_goods_delete_fail';
			else
				return;
		}

		// возвращаемся на главную страницу
		$this->_redirect('');
	}

/*-----------------------------------------------------------------------------*/

	/**
	* Покупка/заказ товара
	*/

	function buyAction()
	{
		// проверяем айдишник
		$id = $this->_checkId();
		// показываем форму
		$form = $this->_formBuy();
		$this->view->form = $form;
		// достаем нужные данные
		$good = $this->model->getGood($id);
		// отдаем в шаблон
		$this->view->good = $good;

		// валидация
		if (!empty($_POST))
		{
			if (!$form->isValid($_POST))
			{
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors();
				// показываем форму с невалидными данными
				return $this->view->form = $this->_formBuy($values, $errors);
			}
		}

		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost())
		{
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();
			$this->view->values = $values;

			/**
			* отправляем письмо
			*/
			// зачитываем конфиг
			$config = $this->_helper->config();
			$this->view->config = $config;
			// инстанцируем Zend_Mail, не забыв указать кодировку
			$mail = new Zend_Mail($config->common->charset);
			// тело сообщения
			$mail->setBodyHtml($this->view->render($this->_scriptPath.'buy_letter.tpl'));
			// имя и адрес отправителя
			$mail->setFrom($config->common->siteMail, $config->common->siteName);
			// имя и адрес получателя
			$mail->addTo( $config->common->adminMail,
							$this->view->translate('store_goods_buy_letter_to_name')
							. ' ' . $config->common->siteName);
			// тема письма
			$mail->setSubject( $config->common->siteName . ': ' . $this->view->translate('store_goods_buy_letter_theme'));
			// отправляем
			$mail->send();


			return $this->view->msg = $this->view->translate('store_goods_buy_ok');
		}


	}

/*==============================================================================*/

	/**
	* Приватный метод для обработки
	* добавления и редактирования
	*
	* @param string $action
	* @param array $data
	* @return void
	*/

	private function _process($action = 'add', $data = array())
	{
		// показываем форму
		$form = $this->_form($data, array(), $action);
		$this->view->form = $form;
		// зачитываем конфиг
		$config = $this->_helper->config();
              
		// валидация
		if (!empty($_POST))
		{
			if (!$form->isValid($_POST))
			{
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors();
				// показываем форму с невалидными данными
				return $this->view->form = $this->_form($values, $errors, $action);
			}
		}

		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost())
		{
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();
               
			// кладем в базу и на главную страницу модуля
			// или показываем сообщение о завершении процесса
			if($action == 'add')
			{
				// выбираем нужные данные для добавления
				$data['name']            = $values['name'];
				$data['s_description']   = $values['ckeditor1'];
				$data['f_description']   = $values['ckeditor2'];
				$data['price']           = $values['price'];
				$data['code']            = $values['code'];
				$data['url']             = $values['url'];
				$data['hit']             = $values['hit'];
				$data['front']           = $values['front'];
				$data['rating']          = $values['rating'];
				$data['stock']           = $values['stock'];
				$data['seo_title']       = $values['seo_title'];
				$data['seo_keywords']    = $values['seo_keywords'];
				$data['seo_description'] = $values['seo_description'];
				$data['mid']             = $values['mid'];
				$data['cid']             = $values['cid'];
				$data['related']         = $values['related'];
				// добавляем данные о товаре в таблицу товаров
				$goodId = $this->model->addGood($data);

				// отфильтруем кастомные свойства товара и добавим их
				foreach($values as $k=>$v)
				{
					// у нас все кастомные свойства имеют имя в виде числа
					if(is_int($k))
					{
						// потом можно добавлять новые
						$propertyData['good_id']     = $goodId;
						$propertyData['property_id'] = $k;
						$propertyData['value']       = $v;
						$this->model->addGoodPropertyValue($propertyData);
					}
				}

				/**
				*  картинки
				*/
				// создаю пустой массив с именами картинок
				$imageData = array();
				// префикс для обеспечения уникальности имени
				$prefix = rand(0, 999999);
				// если юзер загружал картинку - добавляем ее в массив
				if($values['image1'] != null)
				{
					$imageData[0]['file'] = $values['image1'];
					$imageData[0]['main'] = 1;
					$imageData[0]['gid']  = $goodId;
					$imageData[0]['name'] = $values['image1'];
					$this->_helper->imageResize( 'content/store/goods/max/' . $imageData[0]['file'],
									   'content/store/goods/mid/'  . $prefix . $imageData[0]['file'],
									   $config->image->midW, $config->image->midH);
					$this->_helper->imageResize( 'content/store/goods/max/' . $imageData[0]['file'],
									   'content/store/goods/min/'  . $prefix . $imageData[0]['file'],
									   $config->image->minW, $config->image->minH);
					// проверка: загрузился ли файл
					if(    !is_file('content/store/goods/max/' . $imageData[0]['file'])
						or !is_file('content/store/goods/mid/'  . $prefix . $imageData[0]['file'])
						or !is_file('content/store/goods/min/'  . $prefix . $imageData[0]['file']))
					{
						return $this->view->err = $this->view->translate('store_goods_process_img_upload_fail');
					}

					$imageData[0]['file'] = $prefix . $imageData[0]['file'];
				}
				if($values['image2'] != null)
				{
					$imageData[1]['file'] = $values['image2'];
					$imageData[1]['gid']  = $goodId;
					$imageData[1]['name'] = $values['image2'];
					$this->_helper->imageResize( 'content/store/goods/max/' . $imageData[1]['file'],
									   'content/store/goods/mid/'  . $prefix . $imageData[1]['file'],
										$config->image->midW, $config->image->midH);
					$this->_helper->imageResize( 'content/store/goods/max/' . $imageData[1]['file'],
									   'content/store/goods/min/'  . $prefix . $imageData[1]['file'],
									   $config->image->minW, $config->image->minH);
					// проверка: загрузился ли файл
					if(    !is_file('content/store/goods/max/' . $imageData[1]['file'])
						or !is_file('content/store/goods/mid/'  . $prefix . $imageData[1]['file'])
						or !is_file('content/store/goods/min/'  . $prefix . $imageData[1]['file']))
					{
						return $this->view->err = $this->view->translate('store_goods_process_img_upload_fail');
					}

					$imageData[1]['file'] = $prefix . $imageData[1]['file'];
				}
				if($values['image3'] != null)
				{
					$imageData[2]['file'] = $values['image3'];
					$imageData[2]['gid']  = $goodId;
					$imageData[2]['name'] = $values['image3'];
					$this->_helper->imageResize( 'content/store/goods/max/' . $imageData[2]['file'],
									   'content/store/goods/mid/'  . $prefix . $imageData[2]['file'],
									   $config->image->midW, $config->image->midH);
					$this->_helper->imageResize( 'content/store/goods/max/' . $imageData[2]['file'],
									   'content/store/goods/min/'  . $prefix . $imageData[2]['file'],
									   $config->image->minW, $config->image->minH);
					// проверка: загрузился ли файл
					if(    !is_file('content/store/goods/max/' . $imageData[2]['file'])
						or !is_file('content/store/goods/mid/'  . $prefix . $imageData[2]['file'])
						or !is_file('content/store/goods/min/'  . $prefix . $imageData[2]['file']))
					{
						return $this->view->err = $this->view->translate('store_goods_process_img_upload_fail');
					}

					$imageData[2]['file'] = $prefix . $imageData[2]['file'];

				}
				// приводим к нужному виду массив с фотографиями
				foreach($imageData as $k=>$v)
				{
					// и кладем данные в таблицу
					$this->model->addImage($v);
				}

				//$this->_redirect($this->_moduleName);
				return $this->view->msg = $this->view->translate('store_goods_add_ok');
			}
			elseif($action == 'edit')
			{
				// выбираем нужные данные для редактирования
				$newData['name']            = $values['name'];
				$newData['code']            = $values['code'];
				$newData['url']             = $values['url'];
				$newData['s_description']   = $values['ckeditor1'];
				$newData['f_description']   = $values['ckeditor2'];
				$newData['price']           = $values['price'];
				$newData['hit']             = $values['hit'];
				$newData['front']           = $values['front'];
				$newData['rating']          = $values['rating'];
				$newData['stock']           = $values['stock'];
				$newData['seo_title']       = $values['seo_title'];
				$newData['seo_keywords']    = $values['seo_keywords'];
				$newData['seo_description'] = $values['seo_description'];
				$newData['mid']             = $values['mid'];
				$newData['related']         = $values['related'];

				// обновим стандартные свойства товара
				$this->model->updateGood($newData, $data['id']);
               
				// для начала обновления кастомных свойств нам нужно потереть старые значения
				$this->model->delPropertyGoodCross($data['id']);

				// отфильтруем кастомные свойства товара и обновим их тоже
				foreach($values as $k=>$v)
				{
					// у нас все кастомные свойства имеют имя в виде числа
					if(is_int($k))
					{
						// потом можно добавлять новые
						$propertyData['good_id']     = $data['id'];
						$propertyData['property_id'] = $k;
						$propertyData['value']       = $v;
						$this->model->addGoodPropertyValue($propertyData);
					}
				}
                
				//$this->_redirect($this->_moduleName);
				return $this->view->msg = $this->view->translate('store_goods_edit_ok');
			}
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для обработки
	* формочки вопроса о товаре
	*
	* @param array $data
	* @return void
	*/

	private function _processQuestion( $data = array())
	{
		// показываем форму
		$formQuestion = $this->_formQuestion($data, array());
		$this->view->form_question = $formQuestion;
		// зачитываем конфиг
		$config = $this->_helper->config();

		// валидация
		if (!empty($_POST))
		{
			if (!$formQuestion->isValid($_POST))
			{
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму
				$values = $formQuestion->getUnfilteredValues();
				// получаем ошибки
				$errors = $formQuestion->getErrors();
				// показываем форму с невалидными данными
				return $this->view->form_question = $this->_formQuestion($values, $errors);
			}
		}

		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost())
		{
			// получаем корректные данные, введенные юзером
			$values = $formQuestion->getValues();
			$this->view->values = $values;
			$this->view->good = $this->_checkGood();//$this->model->getGood($this->_checkId());

			/**
			* отправляем письмо
			*/
			// зачитываем конфиг
			$config = $this->_helper->config();
			$this->view->config = $config;
			// инстанцируем Zend_Mail, не забыв указать кодировку
			$mail = new Zend_Mail($config->common->charset);
			// тело сообщения
			$mail->setBodyHtml($this->view->render($this->_scriptPath.'question_letter.tpl'));
			// имя и адрес отправителя
			$mail->setFrom($config->common->siteMail, $config->common->siteName);
			// имя и адрес получателя
			$mail->addTo( $config->common->adminMail,
							$this->view->translate('store_goods_processquestion_letter_to_name')
							. ' ' . $config->common->siteName);
			// тема письма
			$mail->setSubject( $config->common->siteName . ': ' . $this->view->translate('store_goods_question_letter_theme'));
			// отправляем
			$mail->send();


			return $this->view->msg = 'store_goods_processquestion_ok';
		}

	}

/*------------------------------------------------------------------------------*/

	/**
	 * Метод для извлечения дочерних категорий.
	 * В метод скармливается линейный массив из всех категорий
	 * и айдишник родительской записи.
	 *
	 * @param $lineArray array
	 * @param $parentId int
	 * @param $treeArray array
	 * @return array
	 */

	private function _getChildren($lineArray = array(),
								$parentId = 0,
								$children = array())
	{
		$children[] = $parentId;   
		foreach($lineArray as $item)
		{
			if($parentId == (int)$item['pid'])
			{
				$children[] = $item['id'];
				$this->_getChildren($lineArray, $item['id'], $children);
			}
		}
		return $children;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки айдишника записи
	*/

	private function _checkId()
	{
		$id = $this->_getParam('id');

		if( $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return $this->_redirect('');
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки самого товара
	*/

	private function _checkGood()
	{
		$id  = $this->_getParam('id');
		$url = $this->_getParam('url');

		// проверим айдишник
		if( $id == false or $id == null    or empty($id) or !isset($id))
		{
			// если при пустом айдишнике нет еще и урла
			if( $url == false or $url == null or empty($url) or !isset($url))
			{
				// отправляем на главную
				return $this->_redirect('');
			}
			else
			{
				// если у нас есть урл - получаем по нему товар
				$good = $this->model->getGoodByUrl($url);
			}
		}
		else
		{
			// если есть айдишник - получаем по нему товар
			$good = $this->model->getGood($id);
		}

		if(empty($good) or false == $good)
		{
			return $this->_redirect('');
		}

		return $good;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки категории
	*/

	private function _checkCategory()
	{
		$id  = $this->_getParam('cid');
		$url = $this->_getParam('category_url');

		// проверим айдишник
		if( $id == false or $id == null	or empty($id) or !isset($id))
		{
			// если при пустом айдишнике нет еще и урла
			if( $url == false or $url == null or empty($url) or !isset($url))
			{
				// отправляем на главную
				return $this->_redirect('');
			}
			else
			{
				// если у нас есть урл - получаем по нему товар
				$category = $this->model->getCategoryByUrl($url);
			}
		}
		else
		{
			// если есть айдишник - получаем по нему товар
			$category = $this->model->getCategory($id);
		}

		if(empty($category) or false == $category)
		{
			return $this->_redirect('');
		}

		return $category;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки сортировщика категгории
	*/

	private function _checkSort()
	{
		$sort = $this->_getParam('sort');

		if( $sort == false
			or $sort == null
			or empty($sort)
			or !isset($sort))
		{
			return 'priceasc';
		}
		elseif(    $sort == 'pricedesc'
				or $sort == 'priceasc'
				or $sort == 'ratedesc'
				or $sort == 'rateasc'
				or $sort == 'stock'
				or $sort == 'hit'
				or (int)$sort > 0
				)
		{
			return $sort;
		}
		else return (int)0;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки сортировщика категгории
	* Сортировка по производителю
	*/

	private function _checkSortManufacturer()
	{
		$sortManufacturer = $this->_getParam('manufacturer');

		if( $sortManufacturer == false
			or $sortManufacturer == null
			or empty($sortManufacturer)
			or !isset($sortManufacturer))
		{
			return (int)0;
		}

		return (int)$sortManufacturer;

	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки айдишника категории
	*/

	private function _checkCid()
	{
		$cid = $this->_getParam('cid');

		if( $cid == false
			or $cid == null
			or empty($cid)
			or !isset($cid))
		{
			$this->_redirect();
		}
		else
		{
			return (int)$cid;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки айдишника производителя
	*/

	private function _checkMid()
	{
		$mid = $this->_getParam('mid');

		if( $mid == false
			or $mid == null
			or empty($mid)
			or !isset($mid))
		{
			return 0;
		}
		else
		{
			return (int)$mid;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	 * Хлебные крошки для страницы товара. Рекурсивно достаются из базы.
	 * Данные возвращаются в виде массива
	 *
	 * @param $id int
	 * @param $level int
	 * @return array
	 */

	private function _getCrumbs($id = 0, $level = 0)
	{
		// статическая переменная для накопления дерева
		static $result = array();

		// получаем данные для дерева категорий и преобразовываем в массив
		$category = $this->model->getParent($id);

		if($category != null)
		{
			$result[$level]['id']   = $category['id'];
			$result[$level]['name'] = $category['name'];
			$this->_getCrumbs($category['pid'], $level + 1);
		}

		// возвращаем результат
		return $result;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для построения формы
	* В качестве аргумента принимает уже заполненые
	* данные (при редактировании)
	*
	* @param $data array
	* @param $errors array
	* @param $action string
	* @return object
	*/

	private function _form($data   = array(),
						   $errors = array(),
						   $action = 'add')
	{
        // обратите внимание, форма создается на основе собственного класса.
        $form = new Lord_Form_Form();
        $form->setAction( '/' . $this->_moduleName.
                          '/' . $this->_controllerName.
                          '/' . $action )
             ->setMethod('POST');

        // кодировка
        $charset = $this->_helper->config()->common->charset;
        
		// получаем список производителей
		$preManufacturers = $this->model->getAllManufacturers()->toArray();

		// приводим его к нужному виду
		$manufacturers[''] = '';
		foreach($preManufacturers as $k=>$v)
		{
			$manufacturers[$v['id']] = $v['name'];
		}

		 // Айдишник кладем в скрытый инпут
		$idValue = ($action == 'add')
				 ? 0
				 : $data['id'];
		$id = $form->createElement('hidden', 'id')
			->setValue($idValue);
		$form->addElement($id);

		$cidValue = ($action == 'add')
				  ? $this->_checkCid()
				  : $data['cid'];
		$cid = $form->createElement('hidden', 'cid')
			->setValue($cidValue);
		$form->addElement($cid);

		// кастомные свойства товара
		$properties = $this->model->getGoodProperties($idValue, $cidValue)->toArray();
		if(!empty($properties))
		{
			$customFields = array();
			foreach($properties as $property)
			{
				$name           = $property['id'];
				$customFields[] = $property['id'];
				$name = new Lord_Form_Element_Text($property['id'], array(
				'required'    => true,
				'label'       => $property['name'],
				// 'description' => $this->view->translate('store_goods_form_name_desc'),
				'maxlength'   => '250',
				'validators'  => array(
					array('StringLength', true, array(0, 250, $charset))
				),
				'value'       => (!empty($data[$property['id']])) ? $data[$property['id']] : ''
				));
				$form->addElement($name);
			}
		}

		// Название товара
		$name = new Lord_Form_Element_Text('name', array(
			'required'    => true,
			'label'       => $this->view->translate('store_goods_form_name'),
			'description' => $this->view->translate('store_goods_form_name_desc'),
			'maxlength'   => '500',
			'validators'  => array(
				array('StringLength', true, array(0, 500, $charset))
			),
			'value'       => (!empty($data['name'])) ? $data['name'] : ''
		));
		$form->addElement($name);

		// Код товара
		$code = new Lord_Form_Element_Text('code', array(
			'required'    => true,
			'label'       => $this->view->translate('store_goods_form_code'),
			'description' => $this->view->translate('store_goods_form_code_desc'),
			'maxlength'   => '500',
			'validators'  => array(
				array('Keywords',     true, array()),
				array('StringLength', true, array(1, 200, $charset))
			),
			'value'       => (!empty($data['code'])) ? $data['code'] : ''
		));
		// если мы добавляем товар - неплохо бы проверить, есть ли такой код в базе
		if($action == 'add')
		{
			$code->addValidator(new Lord_Form_Validate_NoDbRecordExists('store_goods', 'code'));
		}
		$form->addElement($code);

		// URL товара
		$url = new Lord_Form_Element_Text('url', array(
			'required'    => true,
			'label'       => $this->view->translate('store_goods_form_url'),
			'description' => $this->view->translate('store_goods_form_url_desc'),
			'maxlength'   => '500',
			'validators'  => array(
				array('StringLength', true, array(1, 200, $charset))
			),
			'value'       => (!empty($data['url'])) ? $data['url'] : ''
		));
		// если мы добавляем товар - неплохо бы проверить, есть ли такой url в базе
		if($action == 'add')
		{
			$url->addValidator(new Lord_Form_Validate_NoDbRecordExists('store_goods', 'url'));
		}
		$form->addElement($url);

		// Производитель товара
		$manufacturer = new Zend_Form_Element_Select('mid', array(
			'required'    => true,
			'label'       => $this->view->translate('store_goods_form_manufacturer'),
			'description' => $this->view->translate('store_goods_form_manufacturer_desc'),
			'multiOptions'=> $manufacturers,
			'filters'     => array('Int'),
			'value'       => (!empty($data['mid'])) ? $data['mid'] : ''
		));
		$form->addElement($manufacturer);


		// Цена товара
		$price = new Lord_Form_Element_Text('price', array(
			'required'    => true,
			'label'       => $this->view->translate('store_goods_form_price'),
			'description' => $this->view->translate('store_goods_form_price_desc'),
			'maxlength'   => '50',
			'validators'  => array(
				array('Int',          true, array()),
				array('StringLength', true, array(0, 10, $charset))
			),
			'value'       => (!empty($data['price'])) ? $data['price'] : ''
		));
		$form->addElement($price);


		// Хит продаж
		$hit = new Zend_Form_Element_Radio('hit', array(
			'label'       => $this->view->translate('store_goods_form_hit'),
			'description' => $this->view->translate('store_goods_form_hit_desc'),
			'multiOptions'=> array('1' => $this->view->translate('store_goods_form_hit_yes'),
								   '0'=>  $this->view->translate('store_goods_form_hit_no'),),
			'validators'  => array(array('InArray', true, array(array('1', '0'), true))),
			'value'       => (!empty($data['hit'])) ? $data['hit'] : 0 ,
			'required'    => true,
		));
		$hit->setSeparator(' ');
		$form->addElement($hit);

		// Отображать ли товар на витрине
		$front = new Zend_Form_Element_Radio('front', array(
			'label'       => $this->view->translate('store_goods_form_front'),
			'description' => $this->view->translate('store_goods_form_front_desc'),
			'multiOptions'=> array('1' => $this->view->translate('store_goods_form_front_yes'),
								   '0'=>  $this->view->translate('store_goods_form_front_no'),),
			'validators'  => array(array('InArray', true, array(array('1', '0'), true))),
			'value'       => (!empty($data['front'])) ? $data['front'] : 0 ,
			'required'    => true,
		));
		$front->setSeparator(' ');
		$form->addElement($front);


		// Есть ли товар на складе
		$stock = new Zend_Form_Element_Radio('stock', array(
			'required'    => true,
			'label'       => $this->view->translate('store_goods_form_stock'),
			'description' => $this->view->translate('store_goods_form_stock_desc'),
			'multiOptions'=> array('1' => $this->view->translate('store_goods_form_stock_yes'),
								   '0' => $this->view->translate('store_goods_form_stock_no'),),
			'validators'  => array(array('InArray', true, array(array('1', '0'), true))),
			'value'       => (!empty($data['stock'])) ? $data['stock'] : 1
		));
		$stock->setSeparator(' ');
		$form->addElement($stock);


		// Рейтинг товара
		$rating = new Zend_Form_Element_Select('rating', array(
			'label'       => $this->view->translate('store_goods_form_rating'),
			'multiOptions'=> array(1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9),
			'required'    => true,
			'filters'     => array('Int'),
			'description' => $this->view->translate('store_goods_form_rating_desc'),
			'value'       => (!empty($data['rating'])) ? $data['rating'] : ''
		));
		$form->addElement($rating);

		if($action == 'add')
		{
			// Основная фотография
			$image1 = new Zend_Form_Element_File('image1');
			$image1->setLabel($this->view->translate('store_goods_form_image1'))
				   ->setDescription($this->view->translate('store_goods_form_image1_desc'))
				   ->setDestination('content/store/goods/max')
				   // ограничимся загрузкой одного файла
				   ->addValidator('Count', false, 1)
				   // поставим лимит в 100K
				   ->addValidator('Size', false, 102400)
				   // принимать будем только JPEG, PNG, and GIFs
				   ->addValidator('Extension', false, 'jpg,png,gif');
			$form->addElement($image1);


			// Вторая фотография
			$image2 = new Zend_Form_Element_File('image2');
			$image2->setLabel($this->view->translate('store_goods_form_image2'))
				   ->setDescription($this->view->translate('store_goods_form_image2_desc'))
				   ->setDestination('content/store/goods/max')
				   // ограничимся загрузкой одного файла
				   ->addValidator('Count', false, 1)
				   // поставим лимит в 100K
				   ->addValidator('Size', false, 102400)
				   // принимать будем только JPEG, PNG, and GIFs
				   ->addValidator('Extension', false, 'jpg,png,gif');
			$form->addElement($image2);


			// Третья фотография
			$image3 = new Zend_Form_Element_File('image3');
			$image3->setLabel($this->view->translate('store_goods_form_image3'))
				   ->setDescription($this->view->translate('store_goods_form_image3_desc'))
				   ->setDestination('content/store/goods/max')
				   // ограничимся загрузкой одного файла
				   ->addValidator('Count', false, 1)
				   // поставим лимит в 100K
				   ->addValidator('Size', false, 102400)
				   // принимать будем только JPEG, PNG, and GIFs
				   ->addValidator('Extension', false, 'jpg,png,gif');
			$form->addElement($image3);
		}

		// Краткое описание товара
		// Для отображение редактора нужно поле ввода назвать ckeditor1 или ckeditor2
		// Эти имена можно изменить в /design/js/ckeditor/ckeditor_replace.js
		$sDescription = new Zend_Form_Element_Textarea('ckeditor1', array(
			'label'       => $this->view->translate('store_goods_form_s_description'),
			'description' => $this->view->translate('store_goods_form_s_description_desc'),
			'rows'        => '15',
			'required'    => true,
			'cols'        => '50',
			'validators'  => array(
				array('StringLength', true, array(0, 5000, $charset))
			 ),
			'filters'     => array('StringTrim'),
			'value'       => (isset($data['ckeditor1']))
									? $data['ckeditor1']
									: @$data['s_description']
		));
		$form->addElement($sDescription);


		// Полное описание товара
		// Для отображение редактора нужно поле ввода назвать ckeditor1 или ckeditor2
		// Эти имена можно изменить в /design/js/ckeditor/ckeditor_replace.js
		$fDescription = new Zend_Form_Element_Textarea('ckeditor2', array(
			'label'       => $this->view->translate('store_goods_form_f_description'),
			'description' => $this->view->translate('store_goods_form_f_description_desc'),
			'rows'        => '15',
			'required'    => true,
			'cols'        => '50',
			'validators'  => array(
				array('StringLength', true, array(0, 50000, $charset))
			 ),
			'filters'     => array('StringTrim'),
			'value'       => (isset($data['ckeditor2']))
									? $data['ckeditor2']
									: @$data['f_description']
		));
		$form->addElement($fDescription);

		// Связаные товары, они же - аксессуары
		$related = new Lord_Form_Element_Text('related', array(
			'required'    => false,
			'label'       => $this->view->translate('store_goods_form_related'),
			'description' => $this->view->translate('store_goods_form_related_desc'),
			'maxlength'   => '100',
			'validators'  => array(
				array('StringLength', true, array(0, 100, $charset))
			),
			'value'       => (!empty($data['related'])) ? $data['related'] : ''
		));
		$related->addValidator('Related', true);
		$form->addElement($related);

		// SEO - заголовок страницы
		$title = new Lord_Form_Element_SeoTitle('seo_title');
		$title->setValue((!empty($data['seo_title']))
							   ? $data['seo_title']
							   : '');
		$form->addElement($title);

		// SEO - Описание страницы
		$description = new Lord_Form_Element_SeoDescription('seo_description');
		$description->setValue((!empty($data['seo_description']))
									 ? $data['seo_description']
									 : '');
		$form->addElement($description);


		// SEO - Ключевые слова страницы
		$keywords = new Lord_Form_Element_SeoKeywords('seo_keywords');
		$keywords->setValue((!empty($data['seo_keywords']))
								  ? $data['seo_keywords']
								  : '');
		$form->addElement($keywords);


		// Группируем элементы ввода
		$form->addDisplayGroup(
			array('name','code', 'url', 'price','stock','hit','front','rating',
				  'mid', 'image1','image2','image3',
				  'ckeditor1', 'ckeditor2', 'related'), 'goodsDataGroup',
			array('legend' => $this->view->translate('store_goods_form_good_properties'))
		);
		if(!empty($customFields))
		{
			$form->addDisplayGroup(
				$customFields, 'customFieldsGroup',
				array('legend' => $this->view->translate('store_goods_form_custom_properties'))
			);
		}
		$form->addDisplayGroup(
			array('seo_title','seo_keywords', 'seo_description'), 'seoDataGroup',
			array('legend' => $this->view->translate('store_goods_form_seo_properties'))
		);


		// и последним ставим сабмит
		$form->addElement('submit', 'save', array('label' => $this->view->translate('store_goods_form_submit')));

		// ошибки
		$this->_helper->FormErrors($errors, $form);

		return $form;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для построения формы заказа/покупки товара
	* В качестве аргумента принимает уже заполненые
	* данные (при редактировании)
	*
	* @param $data array
	* @param $errors array
	* @return object
	*/

	private function _formBuy($data   = array(),
							  $errors = array())
	{
		// обратите внимание, форма создается на основе собственного класса.
		$form = new Lord_Form_Form();
		$form->setAction( '/' . $this->_moduleName.
						  '/' . $this->_controllerName.
						  '/buy' )
			 ->setMethod('post');

		// кодировка
		$charset = $this->_helper->config()->common->charset;

		// Имя юзернейма, который заказывает товар
		$name = new Lord_Form_Element_Text('name', array(

			'label'       => $this->view->translate('store_goods_formbuy_name'),
			'description' => $this->view->translate('store_goods_formbuy_name_desc'),
			'maxlength'   => '500',
			'validators'  => array(
				array('StringLength', true, array(0, 500, $charset))
			),
			'value'       => (!empty($data['name'])) ? $data['name'] : ''
		));
		$form->addElement($name);

		// Телефон юзернейма, который заказывает товар
		$tel = new Lord_Form_Element_Text('tel', array(
			'required'    => true,
			'label'       => $this->view->translate('store_goods_formbuy_tel'),
			'description' => $this->view->translate('store_goods_formbuy_tel_desc'),
			'maxlength'   => '500',
			/*
			'validators'  => array(
				array('Int',          false, array()) ,
				array('StringLength', true,  array(0, 11, $charset))
			),
			*/
			'value'       => (!empty($data['tel'])) ? $data['tel'] : ''
		));
		$form->addElement($tel);

		// Почта юзернейма, который заказывает товар
		$email = new Lord_Form_Element_Text('email', array(
			'label'       => $this->view->translate('store_goods_formbuy_email'),
			'description' => $this->view->translate('store_goods_formbuy_email_desc'),
			'maxlength'   => '500',
			'validators'  => array(
				array('StringLength', false, array(0, 500, $charset)),
				array('EmailAddress', true,  array()),
			),
			'value'       => (!empty($data['email'])) ? $data['email'] : ''
		));
		$form->addElement($email);


		// Комментарии юзера
		// Для отображение редактора нужно поле ввода назвать ckeditor1 или ckeditor2
		// Эти имена можно изменить в /design/js/ckeditor/ckeditor_replace.js
		$sDescription = new Zend_Form_Element_Textarea('s_description', array(
			'label'       => $this->view->translate('store_goods_formbuy_description'),
			'description' => $this->view->translate('store_goods_formbuy_description_desc'),
			'rows'        => '5',
			'cols'        => '50',
			'validators'  => array(
				array('StringLength', true, array(0, 5000, $charset))
			 ),
			'filters'     => array('StringTrim'),
			'value'       => (isset($data['s_description']))
									? $data['s_description']
									: @$data['s_description']
		));
		$form->addElement($sDescription);

		// Элемент CAPTCHA, защита от спама
		if($this->_helper->config()->captcha_buy == 1)
		{
			$captcha = new Zend_Form_Element_Captcha('captcha', array(
				'label' => $this->view->translate("store_goods_formbuy_captcha"),
				'captcha' => array(
					'captcha'   => 'Image', // Тип CAPTCHA
					'wordLen'   => 4,       // Количество генерируемых символов
					'width'     => 150,     // Ширина изображения
					'timeout'   => 120,     // Время жизни сессии хранящей символы
					'expiration'=> 300,     // Время жизни изображения в файловой системе
					'font'      => 'design/fonts/arial.ttf',   // Путь к шрифту/ Обязательно отностельный
					'imgDir'    => 'temporary/captcha/', // Путь к изобр. Обязательно отностельный
					'imgUrl'    => $this->view->baseUrl . 'temporary/captcha/', // Адрес папки с изображениями
					'gcFreq'    => 5        // Частота вызова сборщика мусора
				),
			));
			$form->addElement($captcha);
		}

		// Айдишник кладем в скрытый инпут
		$id = $form->createElement('hidden', 'id')
			->setValue($this->_checkId());
		$form->addElement($id);
		$cid = $form->createElement('hidden', 'cid')
			->setValue($this->_checkId());
		$form->addElement($cid);


		// и последним ставим сабмит
		$form->addElement('submit', 'save', array('label' => $this->view->translate('store_goods_formbuy_submit')));

		// ошибки
		$this->_helper->FormErrors($errors, $form);

		return $form;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для построения формы вопроса о товаре
	* В качестве аргумента принимает уже заполненые
	* данные (при редактировании)
	*
	* @param $data array
	* @param $errors array
	* @return object
	*/

	private function _formQuestion($data   = array(),
								   $errors = array())
	{
		// обратите внимание, форма создается на основе собственного класса.
		$form = new Lord_Form_Form();

		// кодировка
		$charset = $this->_helper->config()->common->charset;

		// Имя юзернейма, которого интересует что-то
		$name = new Lord_Form_Element_Text('name', array(
			'label'       => $this->view->translate('store_goods_formquestion_name'),
			'description' => $this->view->translate('store_goods_formquestion_name_desc'),
			'maxlength'   => '500',
			'validators'  => array(
				array('StringLength', true, array(0, 500, $charset))
			),
			'value'       => (!empty($data['name'])) ? $data['name'] : ''
		));
		$form->addElement($name);

		// Телефон юзернейма, которого интересует что-то
		$tel = new Lord_Form_Element_Text('tel', array(
			'label'       => $this->view->translate('store_goods_formquestion_tel'),
			'description' => $this->view->translate('store_goods_formquestion_tel_desc'),
			'maxlength'   => '500',
			/*
			'validators'  => array(
				array('Int',          false, array()) ,
				array('StringLength', true,  array(0, 11, $charset))
			),
			*/
			'value'       => (!empty($data['tel'])) ? $data['tel'] : ''
		));
		$form->addElement($tel);

		// Почта юзернейма, который заказывает товар
		$email = new Lord_Form_Element_Text('email', array(
			'required'    => true,
			'label'       => $this->view->translate('store_goods_formquestion_email'),
			'description' => $this->view->translate('store_goods_formquestion_email_desc'),
			'maxlength'   => '500',
			'validators'  => array(
				array('StringLength', false, array(0, 500, $charset)),
				array('EmailAddress', true,  array()),
			),
			'value'       => (!empty($data['email'])) ? $data['email'] : ''
		));
		$form->addElement($email);


		// Комментарии юзера
		$sDescription = new Zend_Form_Element_Textarea('s_description', array(
			'label'       => $this->view->translate('store_goods_formquestion_question'),
			'description' => $this->view->translate('store_goods_formquestion_question_desc'),
			'rows'        => '5',
			'cols'        => '50',
			'required'    => true,
			'validators'  => array(
				array('StringLength', true, array(0, 5000, $charset))
			 ),
			'filters'     => array('StringTrim'),
			'value'       => (isset($data['s_description']))
									? $data['s_description']
									: @$data['s_description']
		));
		$form->addElement($sDescription);

		// Элемент CAPTCHA, защита от спама
		if($this->_helper->config()->captcha_question == 1)
		{
			$captcha = new Zend_Form_Element_Captcha('captcha', array(
				'label' => $this->view->translate("store_goods_formquestion_captcha"),
				'captcha' => array(
					'captcha'   => 'Image', // Тип CAPTCHA
					'wordLen'   => 4,       // Количество генерируемых символов
					'width'     => 150,     // Ширина изображения
					'timeout'   => 120,     // Время жизни сессии хранящей символы
					'expiration'=> 300,     // Время жизни изображения в файловой системе
					'font'      => 'design/fonts/arial.ttf',   // Путь к шрифту/ Обязательно отностельный
					'imgDir'    => 'temporary/captcha/', // Путь к изобр. Обязательно отностельный
					'imgUrl'    => $this->view->baseUrl . 'temporary/captcha/', // Адрес папки с изображениями
					'gcFreq'    => 5        // Частота вызова сборщика мусора
				),
			));
			$form->addElement($captcha);
		}


		// Айдишник кладем в скрытый инпут
		$id = $form->createElement('hidden', 'id')
			->setValue($this->_checkGood()->id);
		$form->addElement($id);


		// и последним ставим сабмит
		$form->addElement('submit',
						  'save',
						  array('label' => $this->view->translate('store_goods_formquestion_submit')));

		// ошибки
		$this->_helper->FormErrors($errors, $form);

		return $form;
	}

/*------------------------------------------------------------------------------*/
}
